<div id="doc4" class="yui-t7"> 
    <div id="hd" class='header'><span>Mini2SAE</span> -- 基于SAE轻量级PHP开发框架</div> 
	
    <div id="bd"> 
	    <div class="yui-gf"> 
            <div class="yui-u first"> 
                <ul>
                    <li><a href='#start'>快速入门</a></li>
                    <li><a href='#dir'>目录结构</a></li>
                    <li><a href='#router'>路由控制器</a></li>
                    <li><a href='#template'>模板</a></li>
                    <li><a href='#database'>数据库操作</a></li>
                    <li><a href='#extension'>扩展库</a></li>
                    <li><a href='#plugin'>插件</a></li>
                    <li><a href='#codes'>使用实例</a></li>
                    <li><a href="#contactus">联系我们</a></li>
                    <li>
                    <a href="http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url=http%3A%2F%2Fcaleng.sinaapp.com%2F" title="分享到QQ空间" target="_blank"><img src="<?php echo App::urlTemplate('image/ico_Qzone.gif')?>" alt="分享到QQ空间" /></a>
                    <a href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fcaleng.sinaapp.com%2F&amp;title=Mini2SAE--PHP framework for SAE" title="分享到GOOGLE书签" target="_blank"><img src="<?php echo App::urlTemplate('image/google.gif')?>" alt="分享到GOOGLE书签" /></a>
                    <a href="http://www.technorati.com/faves?add=http%3A%2F%2Fcaleng.sinaapp.com%2F" title="分享到Technorati" target="_blank"><img src="<?php echo App::urlTemplate('image/technorati.png')?>" alt="分享到Technorati" /></a>
                    <a href="http://twitter.com/home?status=Currently%20reading%20http%3A%2F%2Fcaleng.sinaapp.com%2F" title="分享到推特" target="_blank"><img src="<?php echo App::urlTemplate('image/twitter.png')?>" alt="分享到推特" /></a>
                    <a href="http://v.t.sina.com.cn/share/share.php?url=http%3A%2F%2Fcaleng.sinaapp.com%2F&title=Mini2SAE--PHP framework for SAE" title="分享到新浪微博" target="_blank"><img src="<?php echo App::urlTemplate('image/tsina.gif')?>" alt="分享到新浪微博" /></a>
                    </li>
                </ul>
            </div>
            
            <div class="yui-u"> 
                <p>
                    <span class='Mini2SAE'>Mini2SAE</span>：
                    <B>Mini</B>--核心文件只有<span class='Mini2SAE'>15K</span>，
                    <B>2</B>--to，
                    <B>SAE</B>--Sina App Engine(新浪应用引擎)
                </p>
                <p>基于SAE快速、简单的、轻量级PHP开发框架……</p>
                <p>遵循BSD开源协议的免费开源框架……</p>
                <p>为采用SAE结合第三方开放API的开发模式提供便捷、快速的编程体验……</p>
                <p>支持函数式/面向对象开发、支持MVC、<B>REST风格</B>……</p>
                <p>单一入口、支持简约的路由分发……</p>
                <p>追求自由，简单配置、无任何强制性编码规范……</p>
                <p>内置jquery和YUI Grids CSS框架……</p>
                <br />
                
                <p><B>SAE</B></p>
                <p>
                    SAE是Sina App Engine(新浪应用引擎)的缩写，SAE是一个分布式web应用开发运行的服务平台，
                    其不仅仅包含创建、部署web应用的简单交互，更涉及一整套大规模分布式服务的解决方案。
                    用户通过SAE可以方便的创建web应用、定制web应用、开发web应用、部署web应用、切换线上版本、删除应用，
                    大大节省了开发者的开发成本和运维成本。 
                    <span class='a-link'>
                        <a href='http://wiki.sae.sina.com.cn/doku.php?id=faq' target='_blank'>了解更多SAE！</a>
                    </span>
                </p>
                <br />
                
                <div class='dl'>下载：<span class='a-link'><a href='http://fabos.googlecode.com/files/Mini2SAE.zip'><?php echo App::$mConfig['VERSION'];?></a></span></div>
            </div> 
        </div>
        
        <div class="yui-g">
            <p class='title'><a name='start'>快速入门</a></p>
            <p><B>1. Hello World!</B></p>
            <p>
                本例通过函数式将实现Mini2SAE向世界问好，输出"Hello World!"，
                当然开始前需<span class='a-link'><a href='http://fabos.googlecode.com/files/Mini2SAE.zip'>下载</a>Mini2SAE</span>和<span class='a-link'><a href='http://sae.sina.com.cn/?m=home&a=reg' target='_blank'>注册</a>SAE</span>。
                按照惯例只有先"Hello World!"之后，未来的学习之路才能更加牛逼，否则将诸事不顺……
            </p>
            <p>假设项目根目录名为：root，SAE网址为：http://eg.sinaapp.com/</p>
            <p>1) 打开根目录下index.php文件，即root/index.php，加入如下代码：</p>
            <pre class="jush-php">
&lt;?php
    ...
    App::loader('/', 'helloworld');
    function helloworld() {
        echo 'Hello World!';
    }
    ...
?&gt;
            </pre>
            <p>2) 打开浏览器，输入http://eg.sinaapp.com/，即可显示"Hello World!"。</p>
            <p>3) 支持PHP5.3虚函数，如：</p>
            <pre class="jush-php">
&lt;?php
    ...
    App::loader('/', function(){ echo 'Hello World!'});
    ...
?&gt;
            </pre>
            <br />
            
            <p><B>2. OOP</B></p>
            <p>本例通过面向对象方式，创建一个Test类，赋值模板变量，并显示模板。</p>
            <p>1) 在root/lib目录下创建Test.php，即root/lib/Test.php，输入如下代码：</p>
            <pre class='jush-php'>
&lt;?php
    class Test {
        public function show() {
            App::setVar('content', 'Hello World!');
            App::display('show');
        }
    }
?&gt;
            </pre>
            <p>2) 在root/template目录下创建show.php，即root/template/show.php，输入如下代码：</p>
            <pre class='jush-php'>
&lt;?php
    echo $content;
?&gt;
            </pre>
            <p>3) 在root/index.php文件中加入如下代码：</p>
            <pre class='jush-php'>
&lt;?php
    ...
    App::loader('oop', 'Test/Test::show');
    ...
?&gt;
            </pre>
            <p>4) 打开浏览器，输入http://eg.sinaapp.com/oop，即可显示"Hello World!"。</p>
            <br />
            
            <p class='title'><a name='dir'>目录结构</a></p>
            <p>/ --根目录</p>
            <p>/config --INI配置文件目录</p>
            <p>/config/project.ini --项目主配置</p>
            <p>/include --Mini2SAE核心类目录</p>
            <p>/include/App.class --App核心类</p>
            <p>/lib --项目业务逻辑层</p>
            <p>/plugin --建议目录存放第三方插件(可删除)</p>
            <p>/template --模板目录</p>
            <p>/template/css --样式目录</p>
            <p>/template/js --脚本目录</p>
            <p>/template/image --图像资源目录</p>
            <p>/template/layout.php --公共模板</p>
            <p>/upload --建议目录存放上传文件(可删除)</p>
            <p>/index.php --单一入口文件并在此设置项目访问路由</p>
            <br />
            
            <p class='title'><a name='router'>路由控制器</a></p>
            <p>在<?php echo App::$mConfig['VERSION']?>中，所有的URL工作前，均需在/index.php中事先设置好。设置方法如下：</p>
            <p><B>1. 函数方式</B></p>
            <p>1) 在/index.php中完成路由设置，及业务逻辑处理函数(如：快速入门1. Hello World!)</p>
            <p>2) 在/index.php中完成路由设置，同时在/lib目录下新建业务逻辑处理函数</p>
            <pre class='jush-php'>
&lt;?php 
    //新建/lib/f.php加入show函数
    function show() {
        echo 'function';
    }
    
    //在/index.php加入路由设置 
    App::loader('path', 'show');
    
    //打开浏览器，输入http://eg.sinaapp.com/path，即可显示"function"
?&gt;
            </pre>
            <p><B>2. 面向对象方式</B></p>
            <p>1) 在/index.php中完成路由设置，及业务逻辑处理类</p>
            <p>2) 在/index.php中完成路由设置，同时在/lib目录下新建业务逻辑处理类(如：快速入门2. oop)</p>
            <br />
            <p><span class='Mini2SAE'>*SAE的config.yaml文件中加入如下语句：</span></p>
            <pre class='jush-php'>
handle:
  - rewrite: if(!is_dir() && !is_file() && path ~ "^(.*)$") goto "index.php$1?%{QUERY_STRING}"
            </pre>
            <br />
            
            <p class='title'><a name='template'>模板</a></p>
            <p>通过快速入门可以看出，Mini2SAE中可以不使用任何模板，当然它支持原生PHP并内置公共模板。当然你也可以以插件方式采用第三方模板引擎如：smarty……</p>
            <p>Mini2SAE模板使用是灰常灰常的简单、便捷、快速，核心类App内置函数如下：</p>
            <pre class='jush-php'>
&lt;?php 
    ...
    //设置页面标题，即可在project.ini中设置
    App::setTitle('My title');
    
    
    //设置META，即可在project.ini中设置
    App::setMeta(array('keywords' => '', 'description' => ''));
    
    
    //载入CSS和JS，以逗号分隔输入文件名即可，如载入main.css、style.css和jquery.js、common.js
    //注：Mini2SAE中以内置YUI Grids CSS和Jquery，即可在project.ini中设置
    App::setCssAndJs('main,style', 'jquery,common');
    
    
    //设置模板变量 
    App::setVar('var1', 'value');
    App::setVar('var2', 123456789);
    App::setVar('var3', array(1, 2, 3, 4));
    
    
    //载入模板/template/template1.php
    App::display('template1');
    
    //载入模板/template/dir/template2.php
    App::display('dir/template2');
    ...
?&gt;
            </pre>
            <p>我们建议模板中PHP流程控制采用替代语法，确保一行一条PHP语句，使代码更为清晰明了。</p>
            <p>
                PHP提供了一些流程控制的替代语法，包括 if，while，for，foreach 和 switch。替代语法的基本形式是把左花括号({)换成冒号(:)，
                把右花括号(})分别换成 endif;，endwhile;，endfor;，endforeach; 以及 endswitch;。 
            </p>
            <p>由于Mini2SAE采用了公共模板，你仅需编写body部分即可。</p>
            <pre class='jush-php'>
&lt;p&gt;&lt;?php echo $var1;?&gt;&lt;/p&gt;
&lt;p&gt;&lt;?php echo $var2;?&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;?php foreach ($var3 as $v):?&gt;
    &lt;li&gt;&lt;?php echo $v;?&gt;&lt;/li&gt;
&lt;?php endforeach;?&gt;
&lt;/ul&gt;
            </pre>
            <br />
            
            <p class='title'><a name='database'>数据库操作</a></p>
            <p>
                SAE本身提供了<span class='a-link'><a href='http://apidoc.sinaapp.com/' target='_blank'>SaeMysql</a></span>类操作MySQL数据库，
                <B>本地开发支持PDO</B>，在当前版本<?php echo App::$mConfig['VERSION']?>中提供exec方法封装<B>CUD</B>操作。
            </p>
            <pre class='jush-php'>
&lt;?php 
    //C插入数据表
    $data = array('field1' => 'value1', 'field2' => 'value2', ... );
    $last_id = App::exec('C', $table_name, $data);
    
    
    //U修改数据表
    $data = array('field1' => 'value1', 'field2' => 'value2', ... );
    $condition = '';
    App::exec('U', $table_name, $data, $condition);
    
    
    //D删除数据
    $condition = '';
    App::exec('D', $table_name, '', $condition);
?&gt;            
            </pre>
            <br />
            
            <p class='title'><a name='extension'>扩展库</a></p>
            <p>
                <?php echo App::$mConfig['VERSION']?>版本中，
                扩展库以SAE提供为准，<span class='a-link'><a href='http://apidoc.sinaapp.com/' target='_blank'>访问API文档</a></span>
            </p>
            <p>更多扩展需等进一步开发与整合……</p>
            <br />
            
            <p class='title'><a name='plugin'>插件</a></p>
            <p><?php echo App::$mConfig['VERSION']?>版本中内置插件包括：</p>
            <p>1. <span class='a-link'><a href='http://developer.yahoo.com/yui/grids/' target='_blank'>YUI Grids CSS</a></span></p>
            <p>2. <span class='a-link'><a href='http://jquery.com/' target='_blank'>Jquery.js</a></span></p>
            <br />
            
            <p class='title'><a name='codes'>使用实例</a></p>
            <p>
                <B>1. 订阅豆瓣的内容</B>
                <span class='a-link'><a href='/mini/book' target='_blank'>在线演示</a></span>
            </p>
            <p>1) 新建/lib/DoubanApp.php，输入如下代码：</p>
            <pre class='jush-php'>
&lt;?php 
class DoubanApp {
    public static function getLatest() {
        self::analyzeRss('latest');
    }
    
    public static function getBook() {
        self::analyzeRss('book');
    }
    
    public static function getMovie() {
        self::analyzeRss('movie');
    }
    
    public static function getMusic() {
        self::analyzeRss('music');
    }
    
    private static function analyzeRss($pType) {
        $f = App::getInstance('SaeFetchurl');
        $content = $f->fetch('http://www.douban.com/feed/review/'.$pType);
        
        $xml = simplexml_load_string($content);
        $channel = $xml->channel;
        
        App::setTitle($channel->title);
        App::setVar('content', $channel->item);
        App::display('DoubanApp');
        unset($content, $xml, $channel);
    }
}
?&gt;
            </pre>
            <p>2) 新建模板/template/DoubanApp.php，输入如下代码：</p>
            <pre class='jush-php'>
&lt;ul&gt;
    &lt;li&gt;&lt;a href='/latest'&gt;最新评论&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href='/book'&gt;最新书评&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href='/movie'&gt;最新影论&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href='/music'&gt;最新乐论&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;ul&gt;
&lt;?php foreach ($content as $item):?&gt;
    &lt;li&gt;&lt;a href='&lt;?php echo $item->link;?&gt;'&gt;&lt;?php echo $item->title;?&gt;&lt;/a&gt;&lt;/li&gt;
&lt;?php endforeach;?&gt;
&lt;/ul&gt;
            
            </pre>
            <p>3) 在/index.php加入如下代码：</p>
            <pre class='jush-php'>
&lt;?php 
    ...
    App::loader('latest', 'DoubanApp::getLatest');
    App::loader('book', 'DoubanApp::getBook');
    App::loader('movie', 'DoubanApp::getMovie');
    App::loader('music', array('DoubanApp', 'getMusic'));
    ...
?&gt;            
            </pre>
            <br />

            <p class='title'><a name='contactus'>联系我们</a></p>
            <p id="error"></p>
            <form>
                <span>昵 称(必填)：<br />
                    <input type="text" name="username" id="username" value="" title="请输入昵称..." />
                </span><br />
                <span>邮 箱(必填)：<br />
                    <input type="text" name="email" id="email" value="" title="请输入邮箱..." />
                </span><br />
                <span>内 容(必填)：<br />
                    <textarea name="content" cols="80" rows="5" id="content" title="请输入内容..."></textarea>
                </span><br />
                <span>
                    <input type="hidden" name="token" id="token" value="<?php echo $token;?>" />
                    <input type="button" name="send" id="send" value="提交留言" />
                </span>
            </form>
            <br />
            
            <p class='title'>Mini2SAE刚起步，感谢您的关注，我们会一直加倍努力向前……</p>
        </div>
    </div>
	
    <div id="ft">
        <p class='footer'>
            <img src='<?php echo App::urlTemplate('image/email.png')?>' alt='联系我们' /> <br />
            Copyright&#169;2010 Mini2SAE. All rights reserved. 
        </p>
    </div> 
</div>
<script type="text/javascript">
    $(document).ready(function(){
        $('#send').click(function(){
           var username = $('#username');
           var infor = $('#error').css('color', 'red');
           if ($.trim(username.val()) == '') {
               infor.html(username.attr('title'));
               username.focus(); return false;
           }
           var email = $('#email');
           if ($.trim(email.val()) == '') {
               infor.html(email.attr('title'));
               email.focus(); return false;
           }
           var content = $('#content');
           if ($.trim(content.val()) == '') {
               infor.html(content.attr('title'));
               content.focus(); return false;
           }
           $.ajax({
              url: "/mini/", type: "POST", cache: false,
              data: "username="+$.trim(username.val())+"&email="+$.trim(email.val())+"&content="+$.trim(content.val())+"&token="+$('#token').val(),
              success: function(html) {
                  infor.html(html);
                  username.val('');
                  email.val('');
                  content.val('');
                  $('#error').fadeOut(3000);
              }
           });
        });
    });
</script>